/*11．编写一个名为transform()的函数，接受4个参数：内含double类型数据的源数组名、内含double类型
数据的目标数组名、一个表示数组元素个数的int类型参数、函数名（或等价的函数指针）。transform()函数
应把指定函数应用于源数组中的每个元素，并把返回值储存在目标数组中。例如：

transform(source, target, 100, sin);

该声明会把target[0] 设置为sin(source[0]) ，等等，共有100个元素。在一个程序中调
用transform() 4次，以测试该函数。分别使用math.h 函数库中的两个函数以及自定义的两个函数作为参
数。*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define LENGTH 10
void transform(double src[], double tar[], int n, double (*func)(double));
// void transform(double src[], double tar[], int n, double func(double));

int main(){
    double source[LENGTH], target[LENGTH];
    for(int i = 0; i < LENGTH; i++)
    {
        source[i] = i;
    }    
    printf("The source data is:\n");
    for(int i = 0; i < LENGTH; i++){
        printf("%5g ", source[i]);
    }
    printf("\n");

    transform(source, target, LENGTH, sin);

    printf("The target sin data is:\n");
    for(int i = 0; i < LENGTH; i++){
        printf("%5g ", target[i]);
    }
    printf("\n");

    transform(source, target, LENGTH, cos);

    printf("The target cos data is:\n");
    for(int i = 0; i < LENGTH; i++){
        printf("%5g ", target[i]);
    }
    printf("\n");

    return 0;
}

// void transform(double src[], double tar[], int n, double func(double))
void transform(double src[], double tar[], int n, double (*func)(double)){
    for(int i = 0; i < n; i++){
        tar[i] = func(src[i]);
    }
}
